/**
 * 初始集合有两个数X和Y，两种操作：
 * 1. 从集合中选两个元素a和b，将gcd(a, b)放入集合
 * 2. 从集合中选两个元素a和b，将a+b放入集合
 * 集合是多重集合，a和b不同，但值可以相等
 * 要求200个操作后要得到lcm(X, Y)
 * 
 * 首先求 g = gcd(X, Y)，并将集合改为{x = X/g, y = Y/g}
 * 此时保证gcd(x, y) == 1，原问题就变为从{x, y}要得到 x * y
 * 首先用两次操作1，于是将2个1放入了集合
 * 然后对集合内的每对特定的元素用两次操作2，就能依次得到 2,4,8,16,...
 * 
 * 再将 x * y 做二进制分解， 它一定等于某些二进制加起来
 * 这个操作数量不会太多
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;

llt X, Y;

void proc(){
    if(X % Y == 0 or Y % X == 0) return (void)(cout << "0\n");

    vector<tuple<int, llt, llt>> ans;

    llt g = __gcd(X, Y);
    llt x = X / g, y = Y / g;
    llt target = x * y;
    
    ans.emplace_back(1, x, y);
    ans.emplace_back(1, x, y); // 此时集合里有2个1

    llt tmp = 1;
    while(1){
        target >>= 1;
        if(target == 0) break;

        ans.emplace_back(2, tmp, tmp);
        ans.emplace_back(2, tmp, tmp); // 此时集合里有2个tmp*2

        tmp <<= 1;
    }

    target = x * y;
    vector<llt> candi;
    for(llt s=1;s<=target;s<<=1){
        if(s & target) candi.emplace_back(s);
    }

    llt pre = candi[0];
    for(int i=1,n=candi.size();i<n;++i){
        ans.emplace_back(2, pre, candi[i]);
        pre += candi[i];
    }

    assert(ans.size() <= 200);
    cout << ans.size() << "\n";
    for(auto [a, b, c] : ans){
        cout << a << " " << b * g << " " << c * g << "\n";
    }
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> X >> Y;
        proc();
    }
    return 0;
}